#include "type.h"
#include <stdio.h>

typedef struct descriptor /* 共 8 个字节 */
{
    unsigned short limit_low; // 段界限 0 ~ 15 位
    unsigned int base_low : 24; // 基地址 0 ~ 23 位 16M
    unsigned char type : 4; // 段类型
    unsigned char segment : 1; // 1 表示代码段或数据段 0 表示系统段
    unsigned char DPL : 2; // Descriptor Privilege Level 描述符特权级 0 ~ 3
    unsigned char present : 1; // 存在位，1 在内存中，0 在磁盘上
    unsigned char limit_high : 4; // 段界限 16 ~ 19 位
    unsigned char available : 1; // 该位都安排掉了，送给操作系统吧，无实际作用。
    unsigned char long_mode : 1; // 64 位扩展标志
    unsigned char big : 1; // 32 位 16 位
    unsigned char granularity : 1; // 粒度 4KB 或 1B
    unsigned char base_high : 4; // 基地址 24 ~ 31 位
}__attribute__((packed)) descriptor;

typedef struct descriptor2 /* 共 8 个字节 */
{
    unsigned short limit_low; // 段界限 0 ~ 15 位
    unsigned int base_low : 24; // 基地址 0 ~ 23 位 16M
    unsigned char type : 4; // 段类型
    unsigned char segment : 1; // 1 表示代码段或数据段 0 表示系统段
    unsigned char DPL : 2; // Descriptor Privilege Level 描述符特权级 0 ~ 3
    unsigned char present : 1; // 存在位，1 在内存中，0 在磁盘上
    unsigned char limit_high : 4; // 段界限 16 ~ 19 位
    unsigned char available : 1; // 该位都安排掉了，送给操作系统吧，无实际作用。
    unsigned char long_mode : 1; // 64 位扩展标志
    unsigned char big : 1; // 32 位 16 位
    unsigned char granularity : 1; // 粒度 4KB 或 1B
    unsigned char base_high : 4; // 基地址 24 ~ 31 位
} descriptor2;

int main()
{
    printf("u8 size=%d\n", sizeof(u8));
    printf("u16 size=%d\n", sizeof(u16));
    printf("u32 size=%d\n", sizeof(u32));
    printf("u64 size=%d\n", sizeof(u64));
    printf("descriptor size=%d\n", sizeof(descriptor));
    printf("descriptor2 size=%d\n", sizeof(descriptor2));
    return 0;
}
// 编译命令gcc -m32 -I../include test.c -o test.bin
/*
运行结果：
u8 size=1
u16 size=2
u32 size=4
u64 size=8
descriptor size=8
descriptor2 size=12
*/
